package com.hotel.config.websocket;

import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.concurrent.ConcurrentHashMap;


/**
 * 聊天室
 */
@Component //                               聊天室id
@ServerEndpoint(value = "/WebSocaketServer/{userId}")
public class WebSocaketServer {

    // 1.采用线程安全的ConcurrentHashMap集合作为容器
    private static final ConcurrentHashMap<String, WebSocaketServer> SESSION_POOL = new ConcurrentHashMap<>(); // 存储用户Id和会话对象
    private static final ConcurrentHashMap<String,String> POINT_TO_POINT = new ConcurrentHashMap<>(); // 用户1id和用户2id
    // 2.用户id
    private String userId;
    // 3.创建会话对象
    private Session session;

    /**
     * 客户端创建连接时触发
     * @param session
     * @param userId
     */
    @OnOpen //          会话对象                         聊天室id
    public void onOpen(Session session, @PathParam("userId") String userId) {
        // 将触发的用户id赋值给当前用户id
        this.userId = userId;
        // 将触发的会话对象赋值当前session会话对象
        this.session = session;
        // 判断是否有该聊天室---->判断该集合是否包含当前会话的房间id，有的话直接获取
        if (SESSION_POOL.containsKey(userId)) SESSION_POOL.get(userId);
        else SESSION_POOL.put(userId,this);
        System.out.println("用户:"+userId+"和服务端建立连接");
        System.out.println(SESSION_POOL);
    }

    /**
     * 连接关闭触发该方法
     * @param session
     * @param userId
     */
    @OnClose
    public void onClose(Session session,@PathParam("userId") String userId) {
        // 移除当前会话对象
        SESSION_POOL.remove(userId);
        // 移除用户匹配集合中的数据
        POINT_TO_POINT.remove(userId);
    }

    /**
     * 发送异常时触发
     * @param session
     * @param erroe
     */
    @OnError
    public void onError(Session session,Throwable erroe) {
        System.out.println("异常信息如下:");
        erroe.printStackTrace();
    }

    @OnMessage
    public void onMessage(String message) {
        if (POINT_TO_POINT.containsKey(userId)) {
            System.out.println("收到"+userId+"消息,"+message);
            sendOneMessage(POINT_TO_POINT.get(userId),message);
        } else {
            System.out.println("建立连接");
            POINT_TO_POINT.put(userId,message);
            System.out.println(POINT_TO_POINT);
        }
    }

    // 单个发送发消息
    public void sendOneMessage(String userId,String message) {
        Session session = SESSION_POOL.get(userId).session;
        if (session!=null && session.isOpen()) {
            session.getAsyncRemote().sendText(this.userId+":"+message);
        }
    }

}
